/*
 * @(#)VisitingAglet.java
 *
 * 03L7246 (c) Copyright IBM Corp. 1996, 1998
 *
 * The program is provided "as is" without any warranty express or
 * implied, including the warranty of non-infringement and the implied
 * warranties of merchantibility and fitness for a particular purpose.
 * IBM will not be liable for any damages suffered by you as a result
 * of using the Program. In no event will IBM be liable for any
 * special, indirect or consequential damages or lost profits even if
 * IBM has been advised of the possibility of their occurrence. IBM
 * will not be liable for any third party claims against you.
 */

package example.itinerary;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;

import com.ibm.aglet.Aglet;
import com.ibm.aglet.AgletID;
import com.ibm.aglet.AgletProxy;
import com.ibm.aglet.Message;
import com.ibm.aglet.util.AddressChooser;
import com.ibm.agletx.patterns.Meeting;
import com.ibm.agletx.util.MeetingTask;
import com.ibm.agletx.util.MeetingsItinerary;
import com.ibm.agletx.util.SeqItinerary;

/**
 * <tt>VisitingAglet</tt> illustrates how to use MeetingsItinerary.
 * Remote stationary aglets are created afterwhich a mobile aglet
 * meet with them to dispose them.
 *
 * @version     1.00	$Date: 1999/10/27 05:16:39 $
 * @author	Yariv Aridor
 */
public class VisitingAglet extends Aglet {

    MeetingsItinerary itinerary;
    Vector addresses = new Vector();

    public void onCreation(Object ini) {
       itinerary=new MeetingsItinerary(this);
    }

    public boolean handleMessage(Message msg) {
	if (msg.sameKind("dialog")) {
	    Frame f = new VisitingFrame(this);
	    f.pack();
	    f.setVisible(true);
	    return true;
	} 
	return false;
    }

    public void start() {
	try {
	    itinerary.clear();
	    createStationaryAglets(itinerary);
	    itinerary.startTrip();
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    public void createStationaryAglets(MeetingsItinerary itin) throws Exception {
	String addr = null;
	for (int i=0; i<addresses.size(); i++) {
	    try {
		Meeting m = new Meeting(addr=(String)addresses.elementAt(i));
		//  temoporary since can not create a remote aglet with 
                //  a user defined initial object
		AgletProxy p = getAgletContext().createAglet(null,
							     "examples.itinerary.StationaryAglet", 
							     m);
		p.dispatch(new URL(addr));
		itin.addMeetingTask(new AgletTask(m));
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }
}


class VisitingFrame extends Frame implements WindowListener,ActionListener{
    VisitingAglet aglet;
    List list = new List(10, false);
    AddressChooser address = new AddressChooser(15);
    
    VisitingFrame(VisitingAglet a) {
		aglet = a;
		
		addWindowListener(this);
		
		setLayout(new BorderLayout());
		add("Center", list);

		Panel p = new Panel();
		p.setLayout(new FlowLayout());
		p.add(address);
		Button ad = new Button("Add");
		Button remove = new Button("Remove");
		ad.addActionListener(this);
		remove.addActionListener(this);
		p.add(ad);
		p.add(remove);
		add("North", p);

		p = new Panel();
		p.setLayout(new FlowLayout());
		Button start = new Button("Start!");
		start.addActionListener(this);
		p.add(start);
		add("South", p);

		update();
    }
    /**
     * Handles the action event
     * @param ae the event to be handled
     */
	public void actionPerformed(ActionEvent ae){
		if("Add".equals(ae.getActionCommand())){
			aglet.addresses.addElement(address.getAddress());
			update();
	    }else if("Remove".equals(ae.getActionCommand())){
			int i = list.getSelectedIndex();
			if (i>=0) {
		    	aglet.addresses.removeElementAt(i);
		    	list.delItem(i);
			}
		}else if("Start!".equals(ae.getActionCommand())){
			aglet.start();
		}
	}
	/**
     * Handles the window event
     * @param we the event to be handled
     */
	
	public void windowClosing(WindowEvent we){
		dispose();
	}
	
	public void windowOpened(WindowEvent we){
	}
	
	public void windowIconified(WindowEvent we){
	}
	
	public void windowDeiconified(WindowEvent we){
	}
	
	public void windowClosed(WindowEvent we){
	}
	
	public void windowActivated(WindowEvent we){
	}
	
	public void windowDeactivated(WindowEvent we){
	}


    private void update() {
		list.removeAll();
		Vector addrs = aglet.addresses;
		int size = addrs.size();
		for(int i = 0; i< size; i++) {
	   		list.addItem((String)addrs.elementAt(i));
		}
    }
}



class AgletTask extends MeetingTask {

  	public AgletTask (Meeting meeting) {
    	super(meeting);
  	}

  	public void execute (SeqItinerary itin, Enumeration agletIDs) {
     	String list = "";
      	String id = "";
      	for (;agletIDs.hasMoreElements();) {
	  		list += (AgletID)(agletIDs.nextElement()) + " ";
      	}
      	try { 
	  		id = itin.getOwnerAglet().getAgletID().toString();
      	} catch (Exception ex) {
	  	//
      	}
      	System.out.println(">>VisitingAglet: [" + id  + "] I met with [" + list + "]");
  	} 
}


